﻿// Copyright (c) 2024 神诺科技 www.winsdk.cn
// 
// 保留所有权利。
// 
// 在满足以下条件的情况下，允许重新使用和分发：
// 
// 1. 代码必须保留上述版权声明、作者声明和/或最初发布的网址。
// 2. 不得将代码用于商业目的，除非与版权所有者签订了书面协议。
// 3. 修改过的源版本必须清楚地标识出修改的部分，并且不得以任何方式表明版权所有者支持或认可这些修改。
// 
// 禁止以任何形式的直接或间接商业利用，除非与版权所有者签订了书面协议。
// 
// 本软件由版权所有者和贡献者“按原样”提供，不提供任何形式的明示或暗示保证，包括但不限于适销性和特定用途适用性的保证。在任何情况下，即使被事先告知可能发生损害的可能性，版权所有者或贡献者也不对任何直接、间接、偶然、特殊、示范性或后果性损害承担责任（包括但不限于替代商品或服务的采购、使用损失、数据或利润损失）。


#ifndef _SN_SDK_H__
#define _SN_SDK_H__



#include <windows.h>


enum SN_TRACK_MOVE_TYPE
{
	TRACK_MOVE_TYPE_NORMAL=0,		// 用于常规轨迹 - 普通游戏鼠标轨迹
	TRACK_MOVE_TYPE_SLIDER,			// 用于滑块轨迹，比常规常规轨迹密度更大 - 滑块验证轨迹
};

enum SN_TRACK_POINT_TYPE
{
	TRACK_POINT_TYPE_NORMAL=0,		// 默认绝对坐标
	TRACK_POINT_TYPE_RELATIVE,		// 相对坐标
};


//返回参数
typedef struct SN_RESULT {

	int code;			//错误码，如果为 0 表示成功，否则表示错误号
	char message[4096];	//错误信息，如果为 "OK" 表示成功，否则返回错误信息

}SN_RESULT;


//坐标参数
typedef struct SN_POINT
{
	int x;				//屏幕坐标，左上角（0，0），右下角（1920，1080 - 以实际屏幕为准）
	int y;				//屏幕坐标，左上角（0，0），右下角（1920，1080 - 以实际屏幕为准）

}SN_POINT;

//轨迹参数
typedef struct SN_POINT_PARAMS
{
	struct SN_POINT point;//屏幕坐标，左上角（0，0），右下角（1920，1080 - 以实际屏幕为准）
	int delayTime;		  //延时时间（单位：毫秒），仅供参考

}SN_POINT_PARAMS;


/*创建句柄
*
* 参数：
*	[in] szKey：		卡密(购买卡密：https://shop.4yuns.com/links/7C9F16B7)
* 	[in] pOnnxFilePath：设置 onnx 模型文件路径，如果设置为 NULL，默认和 DLL文件同级目录
* 	[out] pResult：		返回错误信息，参数pResult.code(错误码)如果为 0 表示成功，否则表示错误号;
*
* 返回值：成功返回句柄，失败返回NULL
*
*/
HANDLE WINAPI apiSNCreateHandle(char* szKey, char* pOnnxFilePath, SN_RESULT* pResult);


/*设置鼠标移动轨迹参数，调节轨迹密度/速度/轨迹类型，目前可以支持滑块轨迹/普通轨迹
*
* 参数：
*	[in] handle：		句柄（通过调用apiSNCreateHandle得到）
*  	[in] density：		轨迹密度调节 ,必须大于或者等于 1，默认 5,举个例子：假如轨迹有100个点，设置 density 如下：
*								-  density = 1 时，轨迹有 100/1=100 个点，整个轨迹累计耗时 1000 毫秒 （默认 1 倍速度）
*								-  density = 2 时，轨迹有 100/2=50  个点，整个轨迹累计耗时 500  豪秒 （等价 2 倍速度）
*								-  density = 3 时，轨迹有 100/3=33  个点，整个轨迹累计耗时 333  豪秒 （等价 3 倍速度）
*								-  density = 5 时，轨迹有 100/5=20  个点，整个轨迹累计耗时 200  豪秒 （等价 5 倍速度）
*								
*  	[in] type：			轨迹类型（0代表绝对普通轨迹，1代表滑块轨迹（获得的轨迹点数比普通轨迹点数更多）,具体参考enum SN_TRACK_MOVE_TYPE）
*
* 返回值：返回参数SN_RESULT.code(错误码)如果为 0 表示成功，否则表示错误号;
*
*/
int WINAPI apiSNSetTrackParams(HANDLE handle, int density=5, int type=0);


/*获取鼠标移动轨迹
*
* 参数：
*	[in] handle：		句柄（通过调用apiSNCreateHandle得到）
* 	[in] startPoint：	开始坐标，左上角（0，0），右下角（1920，1080 - 以实际屏幕为准）
* 	[in] endPoint：		结束坐标，左上角（0，0），右下角（1920，1080 - 以实际屏幕为准）
*  	[in] type：			轨迹坐标类型（0代表绝对坐标，1代表相对坐标,具体参考enum SN_TRACK_POINT_TYPE）
* 	[out] points：		轨迹数组，如果数组中元素 point 出现(10000,10000),表示鼠标轨迹结束
*
* 返回值：返回参数SN_RESULT.code(错误码)如果为 0 表示成功，否则表示错误号;
*
*/
int WINAPI apiSNMouseMove(HANDLE handle, SN_POINT *startPoint, SN_POINT *endPoint, int type, SN_POINT_PARAMS* points);


/*获取版本号
*
* 参数：
*	[in] handle：		句柄（通过调用apiSNCreateHandle得到）
* 	[out] szVersion：	版本号
*
* 返回值：返回参数SN_RESULT.code(错误码)如果为 0 表示成功，否则表示错误号;
*
*/
int WINAPI apiSNGetVersion(HANDLE handle, char* szVersion);


/*获取卡密到期时间
*
* 参数：
*	[in]  handle：		句柄（通过调用apiSNCreateHandle得到）
* 	[out] pResult：		返回错误信息，参数pResult->code(错误码)如果为 0 表示成功，否则表示错误号;
*
* 返回值：返回卡密到期时间，失败返回NULL，错误信息请查看参数 pResult->message
*
*/
char* WINAPI apiSNGetKeyExpiresTime(HANDLE handle, SN_RESULT* pResult);


/*获取错误信息
*
* 参数：
*	[in] handle：		句柄（通过调用apiSNCreateHandle得到）
*
* 返回值：返回参数SN_RESULT.code(错误码)如果为 0 表示成功，否则表示错误号;
*
*/
int WINAPI apiSNGetError(HANDLE handle);



/*释放句柄（内存）
*
* 参数：
*	[in] handle：		句柄（通过调用apiSNCreateHandle得到）
*
* 返回值：返回参数SN_RESULT.code(错误码)如果为 0 表示成功，否则表示错误号;
*
*/
int WINAPI apiSNDestroyHandle(HANDLE handle);


#endif // !_SN_SDK_H__
